<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //Object.defineProrerty()给对象的某个属性设置描述符（监听该属性）
    var obj = { name: 'amy', age: 30 }
    // Object.defineProperty(obj,'name',{writable:false})//writable可以控制是否可以修改
    // obj.name = 'ljq'
    // console.log(obj);
    // Object.defineProperty(obj,'name',{configurable:false})//configurable对象属性是否可操作（删除）
    // console.log(obj);
    // Object.defineProperty(obj,'name',{enumerable:false})//enumerable对象属性是否可枚举(遍历)
    // Object.defineProperty(obj, 'name', {

    //     set: function (newValue) {//set函数中不能执行针对该属性的赋值操作，会导致函数的递归调用
    //         console.log('修改了');
    //     },
    //     get: () => {//在get函数中不能执行获取该属性的操作，会导致函数的递归调用
    //         console.log('获取了');
    //         return 'amy' + '!!!'
    //     }
    // })
    // console.log(obj.name);
    // obj.name = 'ljq'



    //监听对象的所有属性
    //思路：
    //1.用for in遍历对象，拿到对象的每个属性
    //2.用Object.defineProperty给对象的每个属性设置监听

    //作用：传入一个对象，对该对象的每个属性进行遍历并且监听
    function listenObj(obj) {
        for (var key in obj) {
            if (typeof obj[key]=='object') {//如果某个属性是引用类型则递归遍历该属性
                listenObj(obj[key])//递归遍历该属性
            }else{//不是引用类型
                Object.defineProperty(obj,key,{
                    set:()=>{console.log('修改了');},
                    get:()=>{console.log('获取了');}
                })
            }

        }
    }
    listenObj(obj)
</script>